#define _CRT_SECURE_NO_WARNINGS 
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
int main()
{
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

	return 0;
}
//#include<bits/stdc++.h>
//using namespace std;
//using ll = long long;
//const ll N = 1e5 + 10;
//ll arr[N], result[N];
//int main()
//{
//	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//	ll n = 0;
//	cin >> n;
//	for (ll i = 1; i <= n; i++)
//	{
//		cin >> arr[i];
//	}
//	ll q = 0;
//	cin >> q;
//	for (ll i = 1; i <= q; i++)
//	{
//		ll x = 0;
//		cin >> x;
//		ll ans = 0;
//		ans = max(ans, x ^ arr[i]);
//		cout << ans << endl;
//	}
//	return 0;
//}
//#include<bits/stdc++.h>
//using namespace std;
//using ll = long long;
//const ll N = 1e5 + 10;
//ll trie[N * 32][2], idx = 2;
//void insert(ll x)
//{
//	ll p = 1;
//	for (ll i = 0; i <= 30; i++)
//	{
//		ll y = ((x >> i) & 1);
//		if (!trie[p][y]) trie[p][y] = idx++;
//		p = trie[p][y];
//	}
//}
//ll query(ll x)
//{
//	ll p = 1;
//	ll res = 0;
//	for (ll i = 0; i <= 30; i++)
//	{
//		ll y = ((x >> i) & 1);
//		if (trie[p][!y])
//		{
//			p = trie[p][!y];
//			res |= (1ll << i);
//		}
//		else
//		{
//			p = trie[p][y];
//		}
//	}
//	return res;
//}
//int main()
//{
//	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//	ll n = 0;
//	cin >> n;
//	for (ll i = 1; i <= n; i++)
//	{
//		ll x = 0;
//		cin >> x;
//		insert(x);
//	}
//	ll q = 0;
//	cin >> q;
//	for (ll i = 1; i <= q; i++)
//	{
//		ll x = 0;
//		cin >> x;
//		cout << query(x) << endl;
//	}
//	return 0;
//}
//#include<bits/stdc++.h>
//using namespace std;
//using Ull = unsigned long long;
//const Ull N = 1e7 + 10;
//Ull a[N], trie[N][2],dp[N][2];
//Ull n, m, idx = 2;
//void insett(Ull x)
//{
//	ll p = 1;
//	for (ll i = 30; i >= 0; i--)
//	{
//		ll y = ((x >> i)) & 1;
//		if (!trie[p][y]) trie[p][y] = idx++;
//		p = trie[p][y];
//	}
//}
//Ull query(Ull x)
//{
//	Ull res = 0;
//	Ull p = 1;
//	for (Ull i = 30; i >= 0; i--)
//	{
//		Ull y = ((x >> i)) & 1;
//		if (trie[p][!y])
//		{
//			p = trie[p][!y];
//			res |= (1LL << i) & 1;
//		}
//		else
//		{
//			p = trie[p][y];
//		}
//	}
//}
//int main()
//{
//	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//	cin >> n >> m;
//	Ull i = 0;
//	for (i = 0; i < n; i++)
//	{
//		cin >> a[i];
//		insert(a[i]);
//	}
//	Ull k = i;
//	for (Ull j = 1; j <= m; j++)
//	{
//		char c;
//		cin >> c;
//		if (c == 'A')
//		{
//			Ull x = 0;
//			cin >> x;
//			k += 1;
//			a[k] = x;
//			insert(a[k]);
//		}
//		else if (c == 'Q')
//		{
//			char c;
//			Ull left = 0, right = 0, x = 0;
//			cin >> c >> left >> right >> x;
//			for (Ull i = left; i <= right; i++)
//			{
//			   Ull result = query(a[i]);
//			   cout << result ^ x << endl;
//			}
//		}
//	}
//	return 0;
//}
//#include<bits/stdc++.h>
//using namespace std;
//using Ull = unsigned long long;
//const Ull N = 1e7 + 10;
//Ull a[N];
//Ull n, m;
//int main()
//{
//	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//	cin >> n >> m;
//	Ull i = 0;
//	for (i = 0; i < n; i++)
//	{
//		cin >> a[i];
//	}
//	Ull k = i;
//	for (Ull j = 1; j <= m; j++)
//	{
//		char c;
//		cin >> c;
//		if (c == 'A')
//		{
//			Ull x = 0;
//			cin >> x;
//			k += 1;
//			a[k] = x;
//		}
//		else if (c == 'Q')
//		{
//			Ull ans = -1;
//			Ull result = 0;
//			char c;
//			Ull left = 0, right = 0, x = 0;
//			cin >> c >> left >> right >> x;
//			for (Ull i = left; i <= right; i++)
//			{
//				for (Ull j = i; j <= k; j++)
//				{
//					result = result ^ a[j];
//				}
//				result = result ^ x;
//				ans = max(ans, result);
//			}
//			cout << ans << endl;
//		}
//
//	}
//	return 0;
//}
//#include<bits/stdc++.h>
//using namespace std;
//using ll = long long;
//const ll INT = 0x3f3f3f;
//const ll Size = 2e5 + 10;
//ll left_pre[Size], right_pre[Size], left_max[Size], left_min[Size], right_max[Size], right_min[Size], A[Size], left_tree[1 << 22][2], right_tree[1 << 22][2];
//ll NeedMax = -1, idx = 2, n = 0;
//void Insert(ll x, ll tree[][2])
//{
//	ll p = 1;
//	for (ll i = 20; i >= 0; i--)
//	{
//		ll y = (x >> i) & 1;
//		if (!tree[p][y]) tree[p][y] = idx++;
//		p = tree[p][y];
//	}
//}
//ll query_max(ll x, ll tree[][2])
//{
//	ll p = 1;
//	ll res = 0;
//	for (ll i = 20; i >= 0; i--)
//	{
//		ll y = (x >> i) & 1;
//		if (tree[p][!y])
//		{
//			p = tree[p][!y];
//			res |= (1 << i) ;
//		}
//		else
//		{
//			p = tree[p][y];
//		}
//	}
//	return res;
//}
//ll query_min(ll x, ll tree[][2])
//{
//	ll p = 1;
//	ll res = 0;
//	for (ll i = 20; i >= 0; i--)
//	{
//		ll y = (x >> i) & 1;
//		if (tree[p][y])
//		{
//			p = tree[p][y];
//		}
//		else
//		{
//
//			p = tree[p][!y];
//			res |= (1 << i);
//
//		}
//	}
//	return res;
//}
//int main()
//{
//	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//	cin >> n;
//	Insert(0, left_tree);
//	left_pre[0] = 0, right_pre[n + 1] = 0, left_max[0] = 0, left_min[0] = INT, right_max[n + 1] = 0, right_min[n + 1] = INT;
//	for (ll i = 1; i <= n; i++)
//	{
//		cin >> A[i];
//		left_pre[i] = left_pre[i - 1] ^ A[i];
//		left_max[i] max(left_max[i - 1], query_max(left_pre[i], left_tree));
//		left_min[i] = min(left_min[i - 1], query_min(left_pre[i], left_tree));
//		Insert(left_pre[i], left_tree);
//	}
//	idx = 2;
//	Insert(0, right_tree);
//	for (ll i = n; i >= 1; i--)
//	{
//		right_pre[i] = right_pre[i + 1] ^ A[i];
//		right_max[i] = max(right_max[i + 1], query_max(right_pre[i], right_tree));
//		right_min[i] = min(right_min[i + 1], query_min(right_pre[i], right_tree));
//		Insert(right_pre[i], right_tree);
//	}
//	for (ll i = 1; i <= n - 1; i++)
//	{
//		NeedMax = max(NeedMax, max(left_max[i] - right_min[i + 1], right_max[i + 1] - left_min[i]));
//	}
//	cout << NeedMax << endl;
//	return 0;
//}
//#include<bits/stdc++.h>
//using namespace std;
//using ll = long long;
//const ll INT = 0x3f3f3f;
//const ll N = 1e5 + 10;
//ll arr[N];
//vector<ll>g[N];
//ll dp[N];
//ll n = 0;
//void dfs(ll x, ll father)
//{
//	dp[x] = arr[x];
//	if (x == n)
//	{
//		return;
//	}
//	for (auto y : g[x])
//	{
//		if (y == father)
//		{
//			continue;
//		}
//		dfs(y, x);
//		dp[x] = max(dp[x], dp[x] ^ arr[y]);
//	}
//}
//
//int main()
//{
//	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//	cin >> n;
//	for (ll i = 0; i < n; i++)
//	{
//		cin >> arr[i];
//	}
//	for (ll i = 1; i <= n; i++)
//	{
//		ll father;
//		cin >> father;
//		g[i].push_back(father - 1);
//		g[father - 1].push_back(i);
//	}
//	dfs(0, -1);
//	cout << dp[0] << endl;
//	return 0;
//}
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll N = 1e5 + 10;
ll trie[N * 32][2], cnt[N],a[N], idx = 2;
ll n;
vector<ll>g[N];
void insert(ll x)
{
	ll p = 1;
	cnt[p]++;
	for (ll i = 30; i >= 0; i--)
	{
		ll y = (x >> i) & 1;
		if (!trie[p][y]) trie[p][y] = idx++;
		p = trie[p][y];
		cnt[p]++;
	}
}
void remove(ll x)
{
	ll p = 1;
	cnt[p]--;
	for (ll i = 30; i >= 0; i--)
	{
		ll y = (x >> i) & 1;
		p = trie[p][y];
		cnt[p]--;
	}
 }

ll query(ll x)
{
	ll p = 1;
	ll res = 0;
	for (ll i = 30; i >= 0; i--)
	{
		ll y = (x >> i) & 1;
		if (trie[p][!y])
		{
			p = trie[p][!y];
			res |= (1LL << i);
		}
		else
		{
			p = trie[p][y];
		}
	}
	return res;
}
void add(ll x)
{
	ll p = 1;
	cnt[p]++;
	for (ll i = 30; i >= 0; i--)
	{
		ll y = (x >> i) & 1;
		p = trie[p][y];
		cnt[p]++;
	}
}
int main()
{
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	cin >> n;
	for (ll i = 1; i <= n; i++)
	{
		cin >> a[i];
		insert(a[i]);
	}
	for (ll i = 1; i <= n; i++)
	{
		ll father = 0;
		cin >> father;
		if (father != -1)
		{
			g[father].push_back(i);
		}
	}
	ll ans = 0;
	for (ll i = 1; i <= n; i++)
	{
		for (auto y : g[i])
		{
			remove(a[y]);
		}
		ans = max(ans, query(a[i]));
		for (auto y : g[i])
		{
			add(a[y]);
		}
	}
	cout << ans << endl;
	return 0;
}